package com.pg_chat.model;

import com.pg_chat.constant.ResponseCode;
import com.pg_chat.exception.JsonException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApiResponse {
    private Integer code;
    private String message;
    private Object data;

    /**
     * 构造一个自定义的API返回
     *
     * @param code    状态码
     * @param message 返回内容
     * @param data    返回数据
     * @return ApiResponse
     */
    public static ApiResponse of(Integer code, String message, Object data) {
        return new ApiResponse(code, message, data);
    }

    /**
     * 构造一个有状态的API返回
     *
     * @param code 状态 {@link ResponseCode}
     * @return ApiResponse
     */
    public static ApiResponse ofStatus(ResponseCode code) {
        return ofStatus(code, null);
    }

    /**
     * 构造一个有状态且带数据的API返回
     *
     * @param code 状态 {@link ResponseCode}
     * @param data 返回数据
     * @return ApiResponse
     */
    public static ApiResponse ofStatus(ResponseCode code, Object data) {
        return of(code.getCode(), code.getMessage(), data);
    }

    /**
     * 构造一个成功且带数据的API返回
     *
     * @param data 返回数据
     * @return ApiResponse
     */
    public static ApiResponse ofSuccess(Object data) {
        return ofStatus(ResponseCode.SUCCESS, data);
    }

    /**
     * 构造一个成功且自定义消息的API返回
     *
     * @param message 返回内容
     * @return ApiResponse
     */
    public static ApiResponse ofMessage(String message) {
        return of(ResponseCode.SUCCESS.getCode(), message, null);
    }

    /**
     * 构造一个异常且带数据的API返回
     *
     * @param t    异常
     * @param data 返回数据
     * @return ApiResponse
     */
    public static ApiResponse ofException(JsonException t, Object data) {
        return of(t.getCode(), t.getMessage(), data);
    }

    /**
     * 构造一个异常且带数据的API返回
     *
     * @param t 异常
     * @return ApiResponse
     */
    public static ApiResponse ofException(JsonException t) {
        return ofException(t, null);
    }

}
